import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.PublicKey.RSA import RsaKey
from configurations.files_path_info import file_paths
from urllib.parse import quote


def get_public_key_by_pem() -> RsaKey:
    """
    获取公钥
    :return: 返回公钥
    """
    file_path = file_paths.get('public_key')
    with open(file_path, 'rb') as file:
        public_key = file.read()
    # 导入公钥文件pem
    result = RSA.importKey(public_key)
    print("公钥数据为：", result)
    return result


def get_private_key_by_pem() -> RsaKey:
    """
    获取私钥
    :return: 返回公钥
    """
    file_path = file_paths.get('private_key')
    with open(file_path, 'rb') as file:
        private_key = file.read()
    # 导入私钥文件pem
    result = RSA.importKey(private_key)
    print("私钥数据为：", result)
    return result


def encrypt_by_public_key(data: str) -> str:
    """
    根据公钥加密
    :param data: 需要被加密的数据
    :return: 加密数据
    """
    # 获取公钥
    public_key = get_public_key_by_pem()
    # 创建一个加解密对象，里面存放了私钥，可以使用私钥加密 或解密
    cipher = PKCS1_v1_5.new(public_key)
    # 使用 加解密对象 加密数据
    encrypt_data = cipher.encrypt(data.encode('utf-8'))
    # 将加密后的数据进行base64编码和utf-8解码（就是将bytes转换为字符串）
    result = base64.b64encode(encrypt_data).decode('utf-8')
    # 消除掉url传参导致+号变成空格
    return quote(result, encoding='utf-8')


def decrypt_by_private_key(encrypt_data: str) -> str:
    """
    根据私钥解密
    :param encrypt_data: 需要解密的数据
    :return: 数据
    """
    # 获取公钥
    private_key = get_private_key_by_pem()
    # 创建一个加解密对象，里面存放了私钥，可以使用私钥加密 或解密
    cipher = PKCS1_v1_5.new(private_key)
    # 处理加密的数据,使用base64解码
    encrypt_data = base64.b64decode(encrypt_data)
    # 使用 加解密对象 解密数据
    decrypt_data = cipher.decrypt(encrypt_data, "解密出错").decode('utf-8')
    return decrypt_data


if __name__ == '__main__':
    encrypt_data1 = encrypt_by_public_key("123")
    decrypt_data1 = decrypt_by_private_key(encrypt_data1)
    print(decrypt_data1)
